/*
 * FreeRTOS V202112.00
 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * http://www.FreeRTOS.org
 * http://aws.amazon.com/freertos
 *
 * 1 tab == 4 spaces!
 */

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#include "cs32f10x.h"
#include "bsp.h"

/* For different compile */
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
    #include <stdint.h>
    extern uint32_t SystemCoreClock;
#endif

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. 
 *
 * See http://www.freertos.org/a00110.html
 *----------------------------------------------------------*/

#define configUSE_PREEMPTION                    1
#define configUSE_TIME_SLICING                  1           /* 1-- 使能时间片调度(默认式使能的) */
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1           /* 1启用特殊方法来选择下一个要运行的任务
                                                               一般是硬件计算前导零(CLZ)指令，如果所使用的
                                                               MCU没有这些硬件指令的话此宏应该设置为0！
                                                               使能此宏后任务优先级最大32 */
                                                               
#define configUSE_TICKLESS_IDLE                 0           /* 1-- 启用低功耗tickless模式 */
#define configUSE_QUEUE_SETS                    1           /* 1-- 启用队列 */
#define configUSE_IDLE_HOOK                     0
#define configUSE_TICK_HOOK                     0
#define configCPU_CLOCK_HZ                      ( SystemCoreClock )
#define configTICK_RATE_HZ                      ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES                    ( 32 )
#define configMINIMAL_STACK_SIZE                ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE                   ( ( size_t ) ( 10 * 1024 ) )//willis change 10->2
#define configMAX_TASK_NAME_LEN                 ( 32 )
#define configGENERATE_RUN_TIME_STATS           0           /* 使用运行时间统计功能 */
#define configUSE_TRACE_FACILITY                1           /* 可视化跟踪调试 */
#define configUSE_STATS_FORMATTING_FUNCTIONS    1           /* 与configUSE_TRACE_FACILITY同时为1时，启用3各函数：
                                                                prvWriteNameToBuffer()
                                                                vTaskList()
                                                                vTaskGetRunTimeStats() */
#if configGENERATE_RUN_TIME_STATS                           /* 时间统计相关的函数定义 */

#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()    ConfigureTimeForRunTimeStats()
#define portGET_RUN_TIME_COUNTER_VALUE()            FreeRTOSRunTimeTicks

#endif

#define configUSE_16_BIT_TICKS                  0
#define configIDLE_SHOULD_YIELD                 0           /* 空闲任务放弃CPU使用权给其他同优先级的用户任务 */
#define configUSE_TASK_NOTIFICATIONS            1
#define configUSE_MUTEXES                       1
#define configQUEUE_REGISTRY_SIZE               8           /*不为0时表示启用队列记录，具体的值是可以
                                                              记录的队列和信号量最大数目。*/
#define configCHECK_FOR_STACK_OVERFLOW          0           /* 大于0时启用堆栈溢出检测功能，如果使用此功能
                                                               用户必须提供一个栈溢出钩子函数，如果使用的话. 
                                                               此值可以为1或者2，因为有两种栈溢出检测方法。*/
#define configUSE_RECURSIVE_MUTEXES             1           /* 使用互斥递归信号量 */
#define configUSE_MALLOC_FAILED_HOOK            0           /* 使用内存申请失败的钩子函数 */
#define configUSE_APPLICATION_TASK_TAG          0
#define configUSE_COUNTING_SEMAPHORES           1           /* 使用计数信号量 */
#define configSUPPORT_DYNAMIC_ALLOCATION        1           /* 使能动态内存申请 */

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES                   0
#define configMAX_CO_ROUTINE_PRIORITIES         ( 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_xTaskGetSchedulerState  0
#define INCLUDE_eTaskGetState           0
#define INCLUDE_xTimerPendFunctionCall  0
#define INCLUDE_vTaskPrioritySet        1
#define INCLUDE_uxTaskPriorityGet       1
#define INCLUDE_vTaskDelete             1
#define INCLUDE_vTaskCleanUpResources   0
#define INCLUDE_vTaskSuspend            1
#define INCLUDE_vTaskDelayUntil         1
#define INCLUDE_vTaskDelay              1
#define	INCLUDE_xTaskGetHandle          1



/* Soft Timer Config */
#define configUSE_TIMERS                    0                               //为1时启用软件定时器
#define configTIMER_TASK_PRIORITY           (configMAX_PRIORITIES-1)        //软件定时器优先级
#define configTIMER_QUEUE_LENGTH            5                               //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH        (configMINIMAL_STACK_SIZE*2)    //软件定时器任务堆栈大小




/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
#define configPRIO_BITS   __NVIC_PRIO_BITS
#else
#define configPRIO_BITS   4 /* 15 priority levels */
#endif


#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         15                      //中断最低优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5                       //系统可管理的最高中断优先级

#define configKERNEL_INTERRUPT_PRIORITY                 ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY            ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

/* This is the value being used as per the library which permits 16
priority values, 0 to 15.  This must correspond to the
configKERNEL_INTERRUPT_PRIORITY setting.  Here 15 corresponds to the lowest
NVIC value of 255. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15


#define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)
#define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int)

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define vPortSVCHandler       SVC_Handler
#define xPortPendSVHandler    PendSV_Handler
#define xPortSysTickHandler   SysTick_Handler

#endif /* FREERTOS_CONFIG_H */

